package com.b.utils;

import io.jsonwebtoken.*;

import java.util.Date;
import java.util.Map;
import java.util.UUID;

public class JwtUtil {
    private static final String secret = "15031592780";
    private static final long time = 1000 * 60 * 60*24*7;
    
    /**
     * 生成JWT长串
     * @param map :自定义的payLoad载荷信息
     * @return jwt长串
     */
    public static String createJWT(Map<String, Object> map) {
        //生成jwtBuilder对象,该对象能进行链式编程:不停的打点调用方法
        JwtBuilder jwtBuilder = Jwts.builder();
        String token = jwtBuilder
                               //header
                               .setHeaderParam("typ", "JWT")
                               .setHeaderParam("alg", "HS256")
                               //Payload 载荷信息
                               .setClaims(map)
                               //设置主题
                               .setSubject("login-test")
                               //设置过期时间
                               .setExpiration(new Date(System.currentTimeMillis() + time))
                               //设置id
                               .setId(UUID.randomUUID().toString())
                               //设置signature
                               .signWith(SignatureAlgorithm.HS256, secret)
                               //            将3个部分合并成一个长串
                               .compact();
        return token;
    }
    
    public static boolean validJwt(String token) {
        //解析
        try {
            Jws<Claims> jws = Jwts.parser()//得到解析对象
                                  .setSigningKey(secret) //设置解析时使用的秘钥
                                  .parseClaimsJws(token);//解析
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("解析错误");
        }
        return false;
    }
    
    public static Claims parseJwt(String token) {
        //解析
        try {
            Jws<Claims> jws = Jwts.parser()//得到解析对象
                                  .setSigningKey(secret) //设置解析时使用的秘钥
                                  .parseClaimsJws(token);//解析
            return jws.getBody();
        } catch (ExpiredJwtException e) {
            e.printStackTrace();
        } catch (UnsupportedJwtException e) {
            e.printStackTrace();
        } catch (MalformedJwtException e) {
            e.printStackTrace();
        } catch (SignatureException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
        return null;
    }
}